//JS 中的多维数组

//定义一个 2*3 的数组，并初始化
// let arr = new Array();
// for (let i = 0; i < 2; i++) {
//   arr[i] = new Array();
//   for (let j = 0; j < 3; j++) {
//     arr[i][j] = i * j;
//   }
// }
// console.log(arr[2][3]);

'use strict';

// var arr = [[1,2,3],[400,500,600],'-'];
// // //本人一开始想到的是：
// // var a = arr[1].slice(1,2);
// // console.log(a);


// var a = arr[1][1];
// console.log(a);

// //练习：如何通过索引取到500这个值：
// var arr = [[1,2,3],[400,500,600],'-'];
// var a = arr[1].slice(1,2);
// console.log(a);

// var arr1 = [[1,2,3],[400,500,600],'-'];
// var x = arr[1][1];
// console.log(x);


// //2.在新生欢迎会上，你已经拿到了新同学的名单，请排序后显示：欢迎XXX，XXX，XXX和XXX同学！：
// var arr2=['小明','小红','大军','阿黄'];
// var last=arr2.sort().pop();
// console.log("欢迎"+arr2.join(',')+"和"+last+"同学！");

// var height = parseFloat(prompt('请输入身高(m):'));
// var weight = parseFloat(prompt('请输入体重(kg):'));
// var bmi = weight/(height**2);
// console.log(height**2);
// console.log(`身高:${height}m,体重:${weight}kg,BMI:${bmi}`);

// if(bmi< 18.5){
//     console.log('过轻');
// }else if(bmi<25){
//     console.log('正常');
// }else if(bmi<28){
//     console.log('过重');
// }else if(bmi<32){
//     console.log('肥胖');
// }else {
//     console.log('严重肥胖')
// }

// var x = 1;
// var i;
// //一个比较基础的for循环
// for (i=1;i<=10;i++){
//     //基础阶乘代码
//     x = x * i;
// }
// if (x === 3628800) {
//     console.log('1 x 2 x 3 x ... x 10 = ' + x);
// }
// else {
//     console.log('计算错误');
// }


// 'use strict';
// var arr = ['Bart', 'Lisa', 'Adam'];

// //用for循环
// for (var i in arr){
//     console.log('Hello，'+arr[i]);
// }
// //---------------------------------------
// //用while循环
// i = 0;
// while (i<arr.length){
//     console.log('Hello,'+arr[i]);
//     i += 1;
// }

// 'use strict';

// function sum(...rest) {
//    var num = 0;
//    var x;
//    for (x of rest) {
//         num = num + x;
//     }
//     return num;
// }

// // 测试:
// var i, args = [];
// for (i=1; i<=100; i++) {
//     args.push(i);
// }
// if (sum() !== 0) {
//     console.log('测试失败: sum() = ' + sum());
// } else if (sum(1) !== 1) {
//     console.log('测试失败: sum(1) = ' + sum(1));
// } else if (sum(2, 3) !== 5) {
//     console.log('测试失败: sum(2, 3) = ' + sum(2, 3));
// } else if (sum.apply(null, args) !== 5050) {
//     console.log('测试失败: sum(1, 2, 3, ..., 100) = ' + sum.apply(null, args));
// } else {
//     console.log('测试通过!');
// }


//练习
//1. 定义一个计算圆面积的函数area_of_circle()，它有两个参数：
//* r: 表示圆的半径；
//* pi: 表示π的值，如果不传，则默认3.14

// 'use strict';

// function area_of_circle(r, pi) {
//     // var area;
//     // if (arguments.length == 2) {
//     //     area = pi * r * r;
//     // } else if (arguments.length < 2){
//     //     pi = 3.14;
//     //     area = pi * r * r;
//     // } else {
//     //     console.log("arguments number must be 1 or 2.")
//     //     return;
//     // }
//     // return area;
//     return r * r * (pi || 3.14);
// }

// // 测试:
// if (area_of_circle(2) === 12.56 && area_of_circle(2, 3.1416) === 12.5664) {
//     console.log('测试通过');
// } else {
//     console.log('测试失败');
// }

// 'use strict';

// function product(arr) {
//    return arr.reduce(function(x,y){
//        return x * y;
// });
// }

// // 测试:
// if (product([1, 2, 3, 4]) === 24 && product([0, 1, 2]) === 0 && product([99, 88, 77, 66]) === 44274384) {
//     console.log('测试通过!');
// }
// else {
//     console.log('测试失败!');
// }

// 'use strict';

// function string2int(s) {

//  return Array.from(s).map( (x) => x - '0').reduce(function(x,y){
//        return x *10 + y;
// });
// }

// // 测试:
// if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
//     if (string2int.toString().indexOf('parseInt') !== -1) {
//         console.log('请勿使用parseInt()!');
//     } else if (string2int.toString().indexOf('Number') !== -1) {
//         console.log('请勿使用Number()!');
//     } else {
//         console.log('测试通过!');
//     }
// }
// else {
//     console.log('测试失败!');
// }

// function get_primes(arr){
//     return arr.filter(function(x){
//         var a = parseInt(Math.sqrt(x));
//         var b = false;
//         for(var i=2;i<=a;i++){
//             if(x % i == 0){
//                 b = true;
//                 break;
//             }
//         }
//         if(!b && x > 1){
//             return x;
//         }
//     });
// }

// // 测试:
// var
//     x,
//     r,
//     arr = [];
// for (x = 1; x < 100; x++) {
//     arr.push(x);
// }
// r = get_primes(arr);
// if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
//     alert('测试通过!');
// } else {
//     alert('测试失败: ' + r.toString());
// }

// 'use strict';
// var arr = [10, 20, 1, 2];
// arr.sort(function (x, y) {
//     if (x < y) {
//         return -1;
//     }
//     if (x > y) {
//         return 1;
//     }
//     return 0;
// });
// console.log(arr);

"use strict";

console.log("---------------sample--------------");

// function* fib(max) {
//     var
//     t,
//     a = 0,
//     b = 1,
//     n = 0;
//     while (n < max) {
//         yield a;
//         [a, b] = [b, a + b];
//         n ++;
//     }
//     return;
// }

// var arr = [];
// for (var x of fib(10)) {
//     arr.push(x);
// }
// console.log(arr); 

console.log("---------------normal--------------");
// function fib(max) {
//     var
//         t,
//         a = 0,
//         b = 1,
//         arr = [0, 1];
//     while (arr.length < max) {
//         [a, b] = [b, a + b];
//         arr.push(b);
//     }
//     return arr;
// }
// 
// console.log(fib(5));

console.log("---------------练习--------------");
//要生成一个自增的ID，可以编写一个next_id()函数
// var current_id = 0;
// function next_id() {
//     current_id ++;
//     return current_id;
// }

// 不用闭包，试用generator改写
function* next_id() {
   var a = 1;
   while (true) {
       yield a++;
   }
   return a;
}

测试:
var
x,
pass = true,
g = next_id();
for (x = 1; x < 100; x ++) {
   if (g.next().value !== x) {
       pass = false;
       console.log('测试失败!');
       break;
   }
}
if (pass) {
   console.log('测试通过!');
}